module MainWindow (main) where

import Graphics.UI.Gtk
import Graphics.UI.Gtk.Gdk.GC
import Graphics.UI.Gtk.ModelView.CellLayout
import Graphics.UI.Gtk.ModelView.CustomStore
import Data.IORef
import Customer
import MainHandler
import PerformedHaircut
import Haircut
import WindowAdministration
import CortesEspecificosDeUsuarioWindow
import WindowUtils
import WindowModifyCustomer

main = do
  initGUI
  window <- windowNew
  window `onDestroy` mainQuit
  windowSetPosition window WinPosCenter
  windowSetTitle window "Peluqueria Nombre Feliz"
  
  -- iniciar la "base de datos" con algunos clientes
  db <- newIORef (initHaircutDataBase initCustomersDataBase)
  
  -- label con el nombre "Clientes"
  lab <- labelNew (Just "Clientes")
  
  -- combo que muestra todos los clientes
  combo <- comboCustomers db
  
  -- "administrative options" button
  buttonAdm <- buttonNewWithLabel "Opciones administrativas"
  buttonAdm `onClicked` (adminWindow db combo)
  
  -- modificar cliente
  buttonSrch <- buttonNewWithLabel "Modificar cliente" 
  buttonSrch `onClicked` (windowModifyCustomer ((getCustomerById (comboBoxGetActive combo) db)) db combo)
  buttonAddHaircut <- buttonNewWithLabel "Agregar Corte"
  buttonAddHaircut `onClicked` cortesEspecificosDeUsuarioWindow (getCustomerById (comboBoxGetActive combo) db) db
  
  -- box vertical para empaquetar cosas
  hbox <- vBoxNew False 5
  
  -- vox horizontal para juntar los botones de editar cliente y de agregar corte nuevo
  vboxEditarYAgregarCorte <- hBoxNew True 2
  boxPackStart vboxEditarYAgregarCorte buttonSrch PackNatural 0
  boxPackStart vboxEditarYAgregarCorte buttonAddHaircut PackNatural 0
  
  
  -- un separador
  sep <- hSeparatorNew
  
  -- Una etiqueta bonita
  (label1,frame1) <- myLabelWithFrameNew
  labelSetText label1 "Gestión de Peluquería 'Nombre Felíz'"
  
  -- Decripcion del programa
  (label2,frame2) <- myLabelWithFrameNew
  labelSetText label2 "\nDiseñado por:\n-Charkiewicz Gastón N.\n-Matwiejczuk Lucas G.\n\nTodavía falta mucho por hacer...\n...porque queremos hacer las cosas bien!\n\nMateria:\nConstrucción de Interfaces de Usuario\n\n\n\n\n\n\n"
  labelSetJustify label2 JustifyCenter

  -- setear algunas propiedades de la ventana y agregar el container hijo
  -- (tambien se hace con containerAdd window child)
  set window [windowDefaultWidth := 300, windowDefaultHeight := 500,
              containerBorderWidth := 10, containerChild := hbox]
  
  -- packing
  boxPackStart hbox lab PackNatural 1
  boxPackStart hbox combo PackNatural 1
  boxPackStart hbox sep PackNatural 1
  boxPackStart hbox vboxEditarYAgregarCorte PackNatural 1
  boxPackStart hbox frame1 PackNatural 1
  boxPackStart hbox frame2 PackNatural 1
  boxPackEnd hbox buttonAdm PackNatural 1
  
  widgetShowAll window
  mainGUI

------------------------------------------------------------------------------------ 

comboCustomers db = do
 
  customers <- readIORef db
  store <- listStoreNew (getCustomers customers)
  combo <- comboBoxEntryNewWithModel store
  customStoreSetColumn store textColumn (getCustomerName)
  comboBoxEntrySetTextColumn combo textColumn
  
  comboBoxSetActive combo 0
  return combo
 
textColumn :: ColumnId Customer String
textColumn = makeColumnIdString 0
               